HTTP通信:获取图片JSON格式并转化下载

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "cJSON.h"


//http://image.baidu.com/channel/listjson?pn=0&rn=30&tag1=%E7%BE%8E%E5%A5%B3&tag2=%E5%85%A8%E9%83%A8&ie=utf8


#define HTTP_REQ "GET/channel/listjson?pn=0&rn=3&tag1=%E7%BE%8E%E5%A5%B3&tag2=%E5%85%A8%E9%83%A8&ie=utf8 \

HTTP/1.1\r\nHost: image.baidu.com\r\nConnection: close\r\n\r\n"




/* https://cache.yisu.com/upload/information/20200302/31/2616.jpg

https://cache.yisu.com/upload/information/20200302/31/2617.jpg

https://cache.yisu.com/upload/information/20200302/31/2620.jpg */


#define HTTP_REQ_PIC "GET/image/pic/item/%s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n"



void *download_run(void *arg)

{

char *t=(char *)arg;

char buf[strlen(t)+1];

memcpy(buf, t, strlen(t)+1);

char www[64]={0};

char pic[128]={0};

sscanf(buf, "http://%[^/]/image/pic/item/%s", www, pic);

printf("%s---%s\n", www, pic);


char requstbuffer[1024]={0};

sprintf(requstbuffer, HTTP_REQ_PIC, pic, www);

//1.连接服务器

int sockfd=插座(AF_INET SOCK_STREAM 0);

如果sockfd & lt;0)

{

返回NULL;

}

结构指向sockaddr_in saddr;

bzero(和saddr, sizeof (saddr));

saddr。sin_family=AF_INET;

,,saddr。sin_port=htons(80);//服务器端口号

saddr.sin_addr。s_addr=inet_addr (“119.146.74.48");//服务器地址

int ret=连接(sockfd, (struct sockaddr *), saddr, sizeof (saddr));

如果(ret & lt;0)

{

perror(“连接fail");

}

//2。发送http请求

写(sockfd、requstbuffer strlen (requstbuffer));

字符缓冲区[1024]={0};

char * p=malloc (1024 * 300);

char * q=p;

unsigned int recvsize=0;

, (1)

{

int ret=阅读(sockfd,缓冲区,1024);

如果(ret & lt;=0)打破;

memcpy (q,缓冲区,ret);

q +=ret;

recvsize +=ret;

memset(缓冲区,0,sizeof(缓冲));

}

=strstr (p,“\ r \ n \ r \ n") + 4;,//获取图片数据结束符后面的有效图片数据

文件*文件=fopen(图片,“w +“);

写入文件(q, recvsize - (qp), 1,文件),

文件关闭(文件);

自由(p);

}




int主要(void)

{

//1。连接服务器

int sockfd=插座(AF_INET SOCK_STREAM 0);

如果sockfd & lt;0)

{

返回1;

}

结构指向sockaddr_in saddr;

bzero(和saddr, sizeof (saddr));

saddr。sin_family=AF_INET;

,,saddr。sin_port=htons(80);//服务器端口号

saddr.sin_addr。s_addr=inet_addr (“14.215.177.185");//服务器地址

int ret=连接(sockfd, (struct sockaddr *), saddr, sizeof (saddr));

如果(ret & lt;0)

{

perror(“连接fail");

}

//2。发送http请求

写(sockfd、HTTP_REQ strlen (HTTP_REQ));

//3。接收服务器应答数据

字符缓冲区[1024]={0};

char * p=malloc (2048 * 30 + 1200);

char * q=p;

, (1)

{

int ret=阅读(sockfd,缓冲区,1024);

如果(ret & lt;=0)打破;

memcpy (q,缓冲区,ret);

q +=ret;

memset(缓冲区,0,sizeof(缓冲));

}

//去掉http头

=strstr (p,“\ r \ n \ r \ n") + 4;

=strstr (q,“{”);

//去掉数据尾巴

char * tmp=strstr (q,“}]} \ r") + 3;

* tmp=& # 39; \ 0 & # 39;;

printf (“% s \ n" q);

//JSON数据解析

cJSON * obj=cJSON_Parse (q);

cJSON *数组=cJSON_GetObjectItem (obj,“data");

int大?cJSON_GetArraySize(数组);

int i=0;

(i=0; i<大小是1;我+ +)

{

cJSON * aobj=cJSON_GetArrayItem(数组,i);

cJSON * picObj=cJSON_GetObjectItem (aobj,“image_url");

//printf (“% s \ n", picObj→valuestring);

//创建线程下载数据

pthread_t id=0;

pthread_create(和id、零download_run, (void *) picObj→valuestring);

usleep (10000),

pthread_detach (id);}

自由(p);

获取字符();

,,,,获取字符();//此两处为了不让主程序退出,影响线程下载图片

HTTP通信:获取图片JSON格式并转化下载