使用Post进行Http通信

--------------siwuxie095

   

   

   

   

   

   

   

有道翻译官网:http://fanyi.youdao.com/

   

找到官网页面下方的 有道翻译API,选择 调用数据接口,申请一个 key

   

(申请内容可随意填写)

   

   

   

   

   

申请成功:

   

   

   

   

   

自动生成一个对应的数据接口:http://fanyi.youdao.com/openapi.do?keyfrom=siwuxie095-test&key=2140200403&type=data&doctype=<doctype>&version=1.1&q=要翻译的文本

   

需要指定 <doctype>要翻译的文本

   

   

   

   

   

关于 API 的说明:

   

   

   

   

   

   

   

工程名:TestHttpPost

包名:com.siwuxie095.http

类名:TestPost.java

   

   

   

工程结构目录如下:

   

   

   

   

代码:

   

package com.siwuxie095.post;

   

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

   

public class TestPost {

 

/**

* 先创建一个URL,打开连接,

* URLConnection 转换成 HttpURLConnection

* 设置连接的所有参数:字符集、可以输入输出、请求方法

* 接着获取输出流,将向服务器传输的数据一次性写出

* 写出之后再获取输入流,再从输入流中读取数据

*

* @param args

*/

   

public static void main(String[] args) {

   

//调用线程:ReadByPost 使用匿名对象

new ReadByPost().start();

}

   

}

   

//创建一个线程:ReadByPost

class ReadByPost extends Thread{

 

//复写 run()方法

@Override

public void run() {

 

try {

 

//创建一个URL对象,属于 java.net 包中的

//传入一个网络连接的地址

//使用Post方法来读取Http数据,传入的URL地址和Get方法不同

//

//(1)http://fanyi.youdao.com/openapi.do 是真实的URL,单纯的网址

//(2)而问号?后面的 keyfrom=siwuxie095...要翻译的文本」 都是向服务器传输的数据,

// 使用网络连接的输出流进行输出

//

//整合在一起就是一个整体的URL,不过这里传入(1)

//有异常抛出,使用 try catch 捕获

URL url=new URL("http://fanyi.youdao.com/openapi.do");

 

//使用openConnection()方法打开链接

//返回值是URLConnection类型,因为是使用Post方法,

//需要创建一个HttpURLConnection 接收返回值

//HttpURLConnection 继承自URLConnection,需要强制类型转换

//同样是 java.net 包中的类

//有异常抛出,用 try catch 捕获

HttpURLConnection connection=(HttpURLConnection) url.openConnection();

 

// connection 设置参数:

//(注意:将所有参数设置完毕后再做其他操作)

//设置编码为 UTF-8

connection.addRequestProperty("encoding", "UTF-8");

//使用 setDoInput() 传入 true,则当前的 connection 就能从网络获取数据

connection.setDoInput(true);

//同样将 setDoOutput()也设置为 true,就可以向服务器传输数据

connection.setDoOutput(true);

// connection 的访问方式设置为Post

connection.setRequestMethod("POST");

 

 

 

 

//connection建立连接之后,要先获取输出流和再获取输出流

 

 

//获取输出流,创建OutputStream接收返回值

OutputStream os=connection.getOutputStream();

//包装

OutputStreamWriter osw=new OutputStreamWriter(os);

//再包装

BufferedWriter bw=new BufferedWriter(osw);

 

 

//先对服务器进行输出(向服务器传输数据,发送请求)

//使用BufferedWriterwrite()方法,这里传入(2),前面加不加 问号 ? 均可

//指定doctype的类型为 XML,翻译:welcome

bw.write("keyfrom=siwuxie095-test&key=2140200403&type=data&"

+ "doctype=xml&version=1.1&q=welcome");

//强制输出 flush

bw.flush();

 

 

 

//获取输入流,创建InputStream接收返回值

InputStream is=connection.getInputStream();

//包装

InputStreamReader isr=new InputStreamReader(is);

//再包装

BufferedReader br=new BufferedReader(isr);

 

 

//接着读取数据(读取从服务器返回的XML数据)

String line;

StringBuilder builder=new StringBuilder();

//如果line不为空,将其填充到builder

while ((line=br.readLine())!=null) {

builder.append(line);

}

 

 

//读取完毕,关闭流

bw.close();

br.close();

osw.close();

isr.close();

os.close();

is.close();

 

//输出读取到的数据

System.out.println(builder.toString());

 

 

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

 

 

}

   

   

运行一览:

   

   

   

   

将输出的 XML 数据,复制->粘贴->格式化:

   

 

   

   

   

   

   

   

【made by siwuxie095】

转载于:https://www.cnblogs.com/siwuxie095/p/6651029.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Qt实现HTTP通信可以使用Qt自带的网络模块Qt Network或者第三方库QHttpEngine。 使用Qt Network模块实现HTTP通信的步骤如下: 1. 创建QNetworkAccessManager对象 QNetworkAccessManager是Qt Network模块中的一个类,用于管理网络请求和响应。我们需要先创建一个QNetworkAccessManager对象。 ```c++ QNetworkAccessManager *manager = new QNetworkAccessManager(this); ``` 2. 创建QNetworkRequest对象 QNetworkRequest是Qt Network模块中的一个类,用于表示一个网络请求。我们需要创建一个QNetworkRequest对象,设置请求的URL和一些请求头信息。 ```c++ QUrl url("http://example.com"); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setRawHeader("User-Agent", "MyApp 1.0"); ``` 3. 发送网络请求 我们可以使用QNetworkAccessManager的get()、post()、put()、deleteResource()等函数发送网络请求。这些函数会返回一个QNetworkReply对象,用于接收服务器响应。 ```c++ QNetworkReply *reply = manager->get(request); ``` 4. 处理服务器响应 当服务器响应到达时,QNetworkAccessManager会发出finished()信号。我们需要连接这个信号,并在槽函数中处理服务器响应。 ```c++ connect(manager, &QNetworkAccessManager::finished, this, [=](QNetworkReply *reply) { if (reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); // 处理服务器响应的数据 } else { qDebug() << "Error:" << reply->errorString(); } reply->deleteLater(); }); ``` 使用QHttpEngine实现HTTP通信的步骤如下: 1. 创建QHttpServer对象 QHttpServer是QHttpEngine中的一个类,用于创建一个HTTP服务器。我们需要先创建一个QHttpServer对象。 ```c++ QHttpServer server; ``` 2. 定义HTTP请求处理函数 我们需要定义一个函数,用于处理HTTP请求。这个函数需要接收一个QHttpServerRequest对象和一个QHttpServerResponse对象参数,分别表示HTTP请求和HTTP响应。 ```c++ void handleRequest(QHttpServerRequest &req, QHttpServerResponse &res) { // 处理HTTP请求 } ``` 3. 注册HTTP请求处理函数 我们需要将handleRequest函数注册到QHttpServer对象中,以便QHttpServer在接收到HTTP请求时调用这个函数。 ```c++ server.route("/", handleRequest); ``` 4. 启动HTTP服务器 我们需要调用QHttpServer对象的listen()函数,启动HTTP服务器。 ```c++ server.listen(QHostAddress::Any, 8080); ``` 5. 发送HTTP请求 我们可以使用Qt Network模块中的QNetworkAccessManager类发送HTTP请求,或者使用curl等工具发送HTTP请求。在发送HTTP请求时,需要指定HTTP请求的URL、请求方法、请求头信息和请求体数据等。 ```c++ QUrl url("http://localhost:8080"); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setRawHeader("User-Agent", "MyApp 1.0"); QNetworkReply *reply = manager->get(request); ``` 6. 处理HTTP响应 当QHttpServer接收到HTTP请求并调用了handleRequest函数后,我们需要在handleRequest函数中处理HTTP请求,并设置HTTP响应的状态码、响应头信息和响应体数据等。 ```c++ void handleRequest(QHttpServerRequest &req, QHttpServerResponse &res) { if (req.method() == QHttpServerRequest::Get) { res.setHeader("Content-Type", "text/plain"); res.write("Hello, World!"); res.end(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值